<?php
class porukaActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
     $porukas = DbFinder::from('Poruka')->leftJoin('Poruka glavna', 'Poruka.PorukaId', 'glavna.Id')->withColumn('glavna.Naslov', 'GlNaslov')->where('PorukaProfil.ProfilId', $this->getUser()->getAttribute('id'))->orderBy('Poruka.CreatedAt')->find();

     $this->porukas = $porukas;
  }

  public function executePoslate(sfWebRequest $request)
  {
     $porukas = DbFinder::from('Poruka')->leftJoin('Poruka glavna', 'Poruka.PorukaId', 'glavna.Id')->withColumn('glavna.Naslov', 'GlNaslov')->where('ProfilId', $this->getUser()->getAttribute('id'))->orderBy('CreatedAt')->find();

     $this->porukas = $porukas;
  }

  public function executePregled(sfWebRequest $request)
  {
     if(DbFinder::from('PorukaProfil')->join('Poruka')->where('Poruka.Id', $poruka_id = $request->getParameter('poruka_id'))->where('Poruka.ProfilId', $this->getUser()->getAttribute('id'))->orWhere('PorukaProfil.ProfilId', $this->getUser()->getAttribute('id'))->count())
     {
       $poruka_gl = DbFinder::from('Poruka')->select('PorukaId')->where('Id', $poruka_id)->findOne();
       if($poruka_gl)
         $poruka = DbFinder::from('Poruka')->with('Profil')->findPk($poruka_gl);
       else $poruka = DbFinder::from('Poruka')->with('Profil')->findPk($poruka_id);

       if($this->getUser()->hasCredential('administrator'))
         $this->controler = 'backend';
       else if($this->getUser()->hasCredential('upravnik'))
         $this->controler = 'uprava';
       else if($this->getUser()->hasCredential('operater'))
        $this->controler = 'administracija';
       else if($this->getUser()->hasCredential('profesor'))
        $this->controler = 'skola';
       else if($this->getUser()->hasCredential('roditelj') or $this->getUser()->hasCredential('ucenik'))
        $this->controler = 'frontend';

       if($poruka->getProfilId() != $this->getUser()->getAttribute('id'))
          $this->odgovors = DbFinder::from('PorukaProfil')->
                            leftJoin('PorukaProfil.PorukaId', 'Poruka.Id')->
                            leftJoin('Poruka.ProfilId', 'Profil.Id')->
                            select(array('Prezime', 'Ime', 'Text', 'CreatedAt'))->
                            withColumn('Profil.Prezime', 'Prezime')->
                            withColumn('Profil.Ime', 'Ime')->
                            withColumn('Poruka.Text', 'Text')->
                            withColumn('Poruka.CreatedAt', 'CreatedAt')->
                            where('Poruka.PorukaId', $poruka->getId())->
                            where('PorukaProfil.ProfilId', $this->getUser()->getAttribute('id'))->
                            orWhere('PorukaProfil.ProfilId', $poruka->getProfilId())->
                            find();
       else
          $this->odgovors = DbFinder::from('Poruka')->
                            leftJoin('Poruka.ProfilId', 'Profil.Id')->
                            select(array('Prezime', 'Ime', 'ProfilId', 'Text', 'CreatedAt'))->
                            withColumn('Profil.Prezime', 'Prezime')->
                            withColumn('Profil.Ime', 'Ime')->
                            where('PorukaId', $poruka->getId())->
                            find();
       $this->poruka = $poruka;
     }
  }

  public function executeNova(sfWebRequest $request)
  {
      isicsBreadcrumbs::getInstance()->addItem($this->getContext()->getI18N()->__('Greške'));
      $this->sent = 0;

      if($request->isMethod('post'))
      {
          $this->error = $this->greskeValidacija($request);
          if(!$this->error)
          {
              $greska = new Greska();
              $greska->setProfilId($this->getUser()->getAttribute('id'));
              $greska->setTip($request->getParameter('tip'));
              $greska->setNaslov($request->getParameter('naslov'));
              $greska->setText($request->getParameter('text'));
              if($greska->save())
              {
                $this->error = '<li class="saved">'.$this->getContext()->getI18N()->__('Vaša poruka je poslata!').'</li>';
                $this->sent = 1;
              }
          }
      }

      if($this->getUser()->hasCredential('administrator'))
      {
        $this->skolas = SkolaPeer::getSkolaList();
        $this->controler = 'backend';
      }
      else if($this->getUser()->hasCredential('upravnik'))
      {
         $this->skolas = $this->getUser()->getAttribute('skolas');
         $this->controler = 'uprava';
      }
      else if($this->getUser()->hasCredential('operater'))
      {
        $this->skolas = SkolaPeer::getSkolaIdList($this->getUser()->getAttribute('skolas'));
        $this->controler = 'administracija';
      }
      else if($this->getUser()->hasCredential('profesor'))
      {
        $this->controler = 'skola';
      }
      else if($this->getUser()->hasCredential('roditelj') or $this->getUser()->hasCredential('ucenik'))
      {
        $this->controler = 'frontend';
      }

      $this->greske = DbFinder::from('Greska')->findBy('ProfilId', $this->getUser()->getAttribute('id'));
      if($this->getUser()->hasCredential('roditelj'))
       $this->setLayout('roditelj');
  }

  private function greskeValidacija($request)
  {
      $err = '';
      if($request->getParameter('tip') == '')
      {
          $err .= '<li>'.$this->getContext()->getI18N()->__('Izaberite tip poruke!').'</li>';
      }

      if($request->getParameter('naslov') == '')
      {
          $err .= '<li>'.$this->getContext()->getI18N()->__('Upišite naslov poruke!').'</li>';
      }

      if($request->getParameter('text') == '')
      {
          $err .= '<li>'.$this->getContext()->getI18N()->__('Upišite tekst poruke!').'</li>';
      }

      if(strlen($err) > 0)
        return $err;
      return FALSE;
  }

  public function executePregledGreske(sfWebRequest $request)
  {
      $greska = DbFinder::from('Greska')->findPk($request->getParameter('greska_id'));
      isicsBreadcrumbs::getInstance()->addItem($this->getContext()->getI18N()->__('Greške'), 'user/greske');
      isicsBreadcrumbs::getInstance()->addItem($greska);

      $this->greska = DbFinder::from('Greska')->findPk($request->getParameter('greska_id'));
      if($this->getUser()->hasCredential('roditelj'))
       $this->setLayout('roditelj');

      if($greska->getStatus() == 2)
      {
        $greska->setStatus(3);
        $greska->save();
      }
  }

  public function executeRazredMenu(sfWebRequest $request)
  {
     $primaoc_tip = $request->getParameter('tip');
     $tip_array = ProfilPeer::$tip;

     if(in_array($primaoc_tip, array($tip_array['administrator'], $tip_array['upravnik'], $tip_array['operater'], $tip_array['profesor'])))
       return $this->renderText('');

     $profil = DbFinder::from('Profil')->findPk($this->getUser()->getAttribute('id'));
     $salje_tip = $profil->getTip();

     if($salje_tip ==$tip_array['administrator'])
     {
        if(!($skola_id = $request->getParameter('skola_id')))
          return $this->renderText('');
        $razreds = RazredPeer::razrediList($skola_id);
     }

     else if($salje_tip ==$tip_array['upravnik'])
     {
        if(count($user_skolas = $this->getUser()->getAttribute('skolas')) == 1)
          list($skola_id, $ime_skole) = each($user_skolas);
        else if(!($skola_id = $request->getParameter('skola_id')))
          return $this->renderText('');
        $razreds = RazredPeer::razrediList($skola_id);
     }

     else if($salje_tip ==$tip_array['operater'])
     {
        if(count($user_skolas = $this->getUser()->getAttribute('skolas')) == 1)
          $skola_id = current($user_skolas);
        else if(!($skola_id = $request->getParameter('skola_id')))
          return $this->renderText('');
        $razreds = RazredPeer::razrediList($skola_id);
     }

     else
     {
        $v_r = $this->viseRazreda($profil);
        if(!$v_r)
          return $this->renderText('');

        if($salje_tip == $tip_array['profesor'])
        {
           $skola_id = $profil->getProfesor()->getSkolaId();
           $credentials = new Credentials();
           $razred_razrednis = $credentials->getRazrednis();
           $razred_predajes = $credentials->getPredajes();
           $razred_ids = array_unique(array_merge($razred_razrednis, $razred_razrednis));
           if(count($razred_ids) == 1)
             return $this->renderText('');
           else $razreds = RazredPeer::razrediIdList($razred_ids);
        }

        else if($salje_tip == $tip_array['roditelj'])
        {
           $razred_ids = array_unique(DbFinder::from('Ucenik')->select('RazredId', sfModelFinder::SIMPLE)->where('RoditeljId', $profil->getId())->find());
           if(count($razred_ids) == 1)
             return $this->renderText('');
           else $razreds = RazredPeer::razrediIdList($razred_ids);
        }

        else if($salje_tip == $tip_array['ucenik'])
        {
           $skola_id = $profil->getUcenik()->getSkolaId();
           $razreds = RazredPeer::razrediIdList($razred_ids);
        }
     }

     $menu = '<select id="primaoci_razred" name="primaoci_razred" onchange="primaociTop();">';
     foreach($razreds as $razred_id => $naziv)
       $menu .= '<option value="'.$razred_id.'">'.$naziv.'</option>';
     $menu .= '</select>';

     return $this->renderText($menu);
  }

  private function viseRazreda($profil)
  {
     $tip = $profil->getTip();
     $tip_array = ProfilPeer::$tip;
     $user = $this->getUser();
     if($tip == $tip_array['administrator'])
       return 0;

     if($tip == $tip_array['upravnik'])
       return 0;

     if($tip == $tip_array['operater'])
       return 0;

     if($tip == $tip_array['profesor'])
     {
        if(count($user->getAttribute('razrednis')));
          return 1;
     }

     if($tip == $tip_array['roditelj'])
     {
        if(DbFinder::from('Ucenik')->where('RoditeljId', $profil->getId())->count() > 1)
          return 1;
     }

     if($tip == $tip_array['ucenik'])
     {
        if(DbFinder::from('UcenikRazred')->where('UcenikId', $profil->getId())->count() > 0)
          return 1;
     }
  }


  public function executePrimaociTop(sfWebRequest $request)
  {
     $primaoc_tip = $request->getParameter('tip');
     $tip_array = ProfilPeer::$tip;
     $profil = DbFinder::from('Profil')->findPk($this->getUser()->getAttribute('id'));
     $salje_tip = $profil->getTip();

     if(!($skola_id = $request->getParameter('skola_id')) or $skola_id == 'n')
     {
        if($salje_tip == $tip_array['administrator'])
          $skola_id = 0;

        else if($salje_tip == $tip_array['upravnik'])
          $skola_id = array_keys($this->getUser()->getAttribute('skolas'));

        else if(in_array($salje_tip, array($tip_array['operater'], $tip_array['profesor'])))
          $skola_id = $this->getUser()->getAttribute('skolas');

        else if($salje_tip == $tip_array['ucenik'])
          $skola_id = $profil->getUcenik()->getSkolaId();

        else if($salje_tip == $tip_array['roditelj'])
          $skola_id = $profil->getRoditelj()->getSkolaId();
     }

     if($primaoc_tip == $tip_array['administrator'])
     {
       $profils = DbFinder::from('Profil')->select(array('Id', 'Prezime', 'Ime'))->where('Tip', $tip_array['administrator'])->orderBy('Prezime')->orderBy('Ime')->find();
     }

     else if($primaoc_tip == $tip_array['upravnik'])
     {
        if($salje_tip == $tip_array['administrator'])
        {
            if($skola_id)
              $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Upravnik.Id')->leftJoin('Upravnik.Id', 'UpravnikSkola.UpravnikId')->select(array('Id', 'Prezime', 'Ime'))->where('Tip', $tip_array['upravnik'])->where('UpravnikSkola.SkolaId', $skola_id)->orderBy('Prezime')->orderBy('Ime')->find();
            else $profils = DbFinder::from('Profil')->select(array('Id', 'Prezime', 'Ime'))->where('Tip', $tip_array['upravnik'])->orderBy('Prezime')->orderBy('Ime')->find();
        }
        else
        {
          $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Upravnik.Id')->leftJoin('Upravnik.Id', 'UpravnikSkola.UpravnikId')->select(array('Id', 'Prezime', 'Ime'))->where('Profil.Tip', $tip_array['upravnik'])->where('UpravnikSkola.SkolaId', 'in', $skola_id)->groupBy('Id')->orderBy('Prezime')->orderBy('Ime')->find();
        }
     }

     else if($primaoc_tip == $tip_array['operater'])
     {
        if($salje_tip == $tip_array['administrator'])
        {
            if($skola_id)
              $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Operater.Id')->leftJoin('Operater.Id', 'OperaterRazred.OperaterId')->leftJoin('OperaterRazred.RazredId', 'Razred.Id')->select(array('Id', 'Prezime', 'Ime'))->where('Tip', $tip_array['operater'])->where('Razred.SkolaId', $skola_id)->groupBy('Id')->orderBy('Prezime')->orderBy('Ime')->find();
            else return $this->renderText('Izaberite školu');
        }
        else
        {
          $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Operater.Id')->leftJoin('Operater.Id', 'OperaterRazred.OperaterId')->leftJoin('OperaterRazred.RazredId', 'Razred.Id')->select(array('Id', 'Prezime', 'Ime'))->where('Tip', $tip_array['operater'])->where('Razred.SkolaId', 'in', $skola_id)->groupBy('Id')->orderBy('Prezime')->orderBy('Ime')->find();
        }
     }

     else if($primaoc_tip == $tip_array['profesor'])
     {
        if($salje_tip == $tip_array['administrator'])
        {
            if($skola_id)
              $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Profesor.Id')->select(array('Id', 'Prezime', 'Ime'))->where('Tip', $tip_array['profesor'])->where('Profesor.SkolaId', $skola_id)->orderBy('Prezime')->orderBy('Ime')->find();
            else return $this->renderText('Izaberite školu');
        }
        else
        {
           if(count($skola_id) > 1)
             return $this->renderText('Izaberite školu');
           else $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Profesor.Id')->select(array('Id', 'Prezime', 'Ime'))->where('Tip', $tip_array['profesor'])->where('Profesor.SkolaId', 'in', $skola_id)->orderBy('Prezime')->orderBy('Ime')->find();
        }
     }

     else if($primaoc_tip == $tip_array['roditelj'])
     {
        if($salje_tip == $tip_array['profesor'])
        {
           $credentials = new Credentials();
           $razred_razrednis = $credentials->getRazrednis();
           $razred_predajes = $credentials->getPredajes();
           $razred_ids = array_unique(array_merge($razred_razrednis, $razred_razrednis));
           if(count($razred_ids) == 1)
             $razred_id = current($razred_ids);
        }

        else if($salje_tip == $tip_array['roditelj'])
        {
           $razred_ids = array_unique(DbFinder::from('Ucenik')->select('RazredId', sfModelFinder::SIMPLE)->where('RoditeljId', $profil->getId())->find());
           if(count($razred_ids) == 1)
             $razred_id = current($razred_ids);
        }

        if(!isset($razred_id))
          if(!($razred_id = $request->getParameter('razred_id')))
            return $this->renderText('Izaberite razred');

        $razred = DbFinder::from('Razred')->with('Smer')->findPk($razred_id);
        $smer_tip = $razred->getSmer()->getTip();

        if($salje_tip == $tip_array['administrator'])
        {
           if($skola_id)
             if($smer_tip == SmerPeer::$tip['redovni'])
               $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Roditelj.Id')->leftJoin('Roditelj.Id', 'Ucenik.RoditeljId')->select(array('Id', 'Prezime', 'Ime', 'Roditelj.PrezimeMajka', 'Roditelj.ImeMajka', 'Roditelj.PrezimeStaratelj', 'Roditelj.ImeStaratelj'))->where('Tip', $tip_array['roditelj'])->where('Ucenik.RazredId', $razred_id)->orderBy('Prezime')->orderBy('Ime')->find();
             else $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Roditelj.Id')->leftJoin('Roditelj.Id', 'Ucenik.RoditeljId')->leftJoin('Ucenik.Id', 'UcenikRazred.UcenikId')->select(array('Id', 'Prezime', 'Ime', 'Roditelj.PrezimeMajka', 'Roditelj.ImeMajka', 'Roditelj.PrezimeStaratelj', 'Roditelj.ImeStaratelj'))->where('Tip', $tip_array['roditelj'])->where('UcenikRazred.RazredId', $razred_id)->orderBy('Prezime')->orderBy('Ime')->find();
           else return $this->renderText('Izaberite školu');
        }

        else
        {
           if(count($skola_id) > 1)
             return $this->renderText('Izaberite školu');
           if($smer_tip == SmerPeer::$tip['redovni'])
             $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Roditelj.Id')->leftJoin('Roditelj.Id', 'Ucenik.RoditeljId')->select(array('Id', 'Prezime', 'Ime', 'Roditelj.PrezimeMajka', 'Roditelj.ImeMajka', 'Roditelj.PrezimeStaratelj', 'Roditelj.ImeStaratelj'))->where('Tip', $tip_array['roditelj'])->where('Ucenik.RazredId', $razred_id)->orderBy('Prezime')->orderBy('Ime')->find();
           else $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Roditelj.Id')->leftJoin('Roditelj.Id', 'Ucenik.RoditeljId')->leftJoin('Ucenik.Id', 'UcenikRazred.UcenikId')->select(array('Id', 'Prezime', 'Ime', 'Roditelj.PrezimeMajka', 'Roditelj.ImeMajka', 'Roditelj.PrezimeStaratelj', 'Roditelj.ImeStaratelj'))->where('Tip', $tip_array['roditelj'])->where('UcenikRazred.RazredId', $razred_id)->orderBy('Prezime')->orderBy('Ime')->find();
        }
     }

     else if($primaoc_tip == $tip_array['ucenik'])
     {
        if(!($razred_id = $request->getParameter('razred_id')))
          return $this->renderText('Izaberite razred');

        if($salje_tip == $tip_array['administrator'])
        {
           if($skola_id)
              $profils = DbFinder::from('Profil')->leftJoin('Profil.Id', 'Ucenik.Id')->select(array('Id', 'Prezime', 'Ime'))->where('Tip', $tip_array['ucenik'])->where('Ucenik.RazredId', $razred_id)->orderBy('Prezime')->orderBy('Ime')->find();
            else return $this->renderText('Izaberite školu');
        }
     }

     $text = $this->renderCheckboxes($profils);
     //$this->text = $text;
     return $this->renderText($text);
  }

  private function renderCheckboxes($profils)
  {
     $c_bs = '';
     foreach($profils as $profil)
     {
        // ako je roditelj
        if(isset($profil['Roditelj.PrezimeMajka']))
        {
           if($profil['Ime'] == '' and $profil['Roditelj.ImeMajka'] != '')
           {
              $profil['Prezime'] = $profil['Roditelj.PrezimeMajka'];
              $profil['Ime'] = $profil['Roditelj.ImeMajka'];
           }

           else if($profil['Ime'] == '' and $profil['Roditelj.ImeStaratelj'] != '')
           {
              $profil['Prezime'] = $profil['Roditelj.PrezimeStaratelj'];
              $profil['Ime'] = $profil['Roditelj.ImeStaratelj'];
           }
        }

        $c_bs .= '<input type="checkbox" name="'.$profil['Id'].'" value="'.$profil['Id'].'" />'.$profil['Prezime'].' '.$profil['Ime'].'<br /> ';
     }

     return $c_bs;
  }

  public function executeSend(sfWebRequest $request)
  {
     $profil_id = $this->getUser()->getAttribute('id');

     $poruka = new Poruka();
     $poruka->setNaslov($request->getParameter('naslov'));
     $poruka->setText($request->getParameter('content'));
     $poruka->setProfilId($profil_id);
     $poruka->save();

     if(strlen($request->getParameter('profil_ids')))
     {
        $poruka_id = $poruka->getId();
        $profil_ids = array_unique(explode('||', $request->getParameter('profil_ids')));
        foreach($profil_ids as $profil_id)
        {
           $p_p = new PorukaProfil();
           $p_p->setPorukaId($poruka_id);
           $p_p->setProfilId($profil_id);
           $p_p->save();
        }
     }

     return $this->renderText('Poslato');
  }

  public function executeSendOdgovor(sfWebRequest $request)
  {
     $profil_id = $this->getUser()->getAttribute('id');
     $poruka = DbFinder::from('Poruka')->findPk($request->getParameter('poruka_id'));

     $odgovor = new Poruka();
     $odgovor->setText($request->getParameter('content'));
     $odgovor->setProfilId($profil_id);
     $odgovor->setPorukaId($poruka->getId());
     $odgovor->save();

     $p_p = new PorukaProfil();
     $p_p->setPorukaId($odgovor->getId());
     $p_p->setProfilId($poruka->getProfilId());
     $p_p->save();

     return $this->renderText('Poslato');
  }

}